close all
clear all
clc 

% 用户参数设置
inputFile = 'HisiRAW_1920x1080_16bits_GRBG_Linear_20250325110723.raw';      % 输入文件名
outputPattern = 'frame_%04d.raw'; % 输出文件名模式（四位数字编号）
width = 1920;                % 图像宽度（像素）
height = 1080;               % 图像高度（像素）
bytesPerPixel = 2;           % 每像素字节数（1=8bit, 2=16bit）

% 计算单帧数据量（字节）
frameSizeBytes = width * height * bytesPerPixel;

% 读取原始文件数据
fid = fopen(inputFile, 'rb');
if fid == -1
    error('无法打开输入文件：%s', inputFile);
end
rawData = fread(fid, inf, 'uint8=>uint8'); % 以字节形式读取全部数据
fclose(fid);

% 验证数据完整性
totalBytes = numel(rawData);
numFrames = totalBytes / frameSizeBytes;
if mod(totalBytes, frameSizeBytes) ~= 0
    error('文件大小不匹配，总字节数 %.0f 无法整除单帧字节数 %.0f',...
          totalBytes, frameSizeBytes);
end

% 创建输出目录（可选）
outputDir = 'output_frames';
if ~exist(outputDir, 'dir')
    mkdir(outputDir);
end

% 分割并处理每一帧
for frameIdx = 1:numFrames
    % 提取当前帧的原始字节数据
    startByte = (frameIdx-1)*frameSizeBytes + 1;
    endByte = frameIdx*frameSizeBytes;
    frameBytes = rawData(startByte:endByte);
    
    % 将字节数据转换为uint16数组（小端序）
    pixels = typecast(frameBytes, 'uint16');
    
    % 右移4位处理（保留12位有效数据）
    shifted_pixels = bitshift(pixels, -4);
    
    % 将处理后的数据转回字节流
    processedBytes = typecast(shifted_pixels, 'uint8');
    
    % 生成输出路径
    outputFile = fullfile(outputDir, sprintf(outputPattern, frameIdx));
    
    % 写入处理后的帧数据
    fidOut = fopen(outputFile, 'wb');
    if fidOut == -1
        error('无法创建输出文件：%s', outputFile);
    end
    fwrite(fidOut, processedBytes, 'uint8');
    fclose(fidOut);
end

fprintf('成功拆分并处理 %d 帧数据到目录：%s\n', numFrames, outputDir);